﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
//importamos
using Sauces.Bussinees.Entities.Compras;
using Sauces.Bussinees.Entities.Almacen;
using Sauces.Bussinees.Logic.Service;
using Sauces.Bussinees.Logic.Compras.Service;
using Microsoft.Practices.Unity;
using System.Web.ModelBinding;

namespace Sauces.Web.Compras
{
    public partial class FrmPedidoProveedor : System.Web.UI.Page
    {
        private const string KeyPedido  = "Pedido";

        [Dependency]
        public IProveedorService proveedorService { set; get; }

        [Dependency]
        public IProductoService productoService { set; get; }

        [Dependency]
        public IPedidoProveedorService pedidoService { set; get; }

        protected void Page_Load(object sender, EventArgs e)
        {
            var opc = Request.QueryString["opc"];
            var IdPedido= Request.QueryString["id"];

            if (!Page.IsPostBack)
            {
                if (opc != null && opc == "new")
                {
                    var nuevoPedido = new PedidoProveedor()
                    {
                        Fecha = DateTime.Now,
                        
                    };


                    BindingPedidoProveedor(nuevoPedido);

                    ViewState["opc"] = opc;
                    
                }
                else if (opc != null && opc == "editar" && IdPedido != null)
                {
                    var pedido = pedidoService.getFromPedidoProveedorById(Int32.Parse(IdPedido.ToString()));
                    BindingPedidoProveedor(pedido);
                    ViewState["opc"] = opc;
                }

                else if (opc != null && opc == "detalle" && IdPedido != null)
                {
                    var pedido = pedidoService.getFromPedidoProveedorById(Int32.Parse(IdPedido.ToString()));
                    btnBuscarProveedor.Visible = false;
                    txtRuc.ReadOnly = true;
                    btnGuardarPedido.Visible = false;
                    lvProducto.Visible = false;
                    upProductos.Visible = false;
                    BindingPedidoProveedor(pedido);
                    ViewState["opc"] = opc;
                }
            }

        }

        private void BindingPedidoProveedor(PedidoProveedor nuevoPedido)
        {
            Cache.Insert(KeyPedido, nuevoPedido);

            txtId.Text = nuevoPedido.Id.ToString();
            txtFecha.Text = nuevoPedido.Fecha.ToShortDateString();
            

            if (nuevoPedido.Proveedor != null)
            {
                txtRuc.Text = nuevoPedido.Proveedor.Ruc.ToString();
                txtRazon.Text = nuevoPedido.Proveedor.RazonSocial.ToString();
                txtNombre.Text = nuevoPedido.Proveedor.Nombre.ToString();
                txtDireccion.Text = nuevoPedido.Proveedor.Direccion.ToString();
                txtApellidos.Text = nuevoPedido.Proveedor.Apellidos.ToString();
                txtNCuenta.Text = nuevoPedido.Proveedor.NCuenta.ToString();

            }

            nuevoPedido.Total = nuevoPedido.DetallePedidoProveedor.Sum(dp => dp.Monto);
            Cache.Insert(KeyPedido, nuevoPedido);

            lvDetallePedido.DataSource = nuevoPedido.DetallePedidoProveedor;
            lvDetallePedido.DataBind();

            var lbltotal = lvDetallePedido.FindControl("lblTotal") as Label;
            if (lbltotal != null)
            {
                lbltotal.Text = nuevoPedido.Total.ToString();
            }
        }

        protected void btnBuscarProveedor_Click1(object sender, EventArgs e)
        {
            var ruc = txtRuc.Text;

            var proveedor = proveedorService.getFromProveedorByRuc(ruc);

            var pedidoProveedor = Cache.Get(KeyPedido) as PedidoProveedor;

            if (proveedor == null)
            {
                lblMsgProveedor.Text = "El Proveedor no existe !!!";
                txtRuc.Text = "";
                txtRazon.Text = "";
                txtDireccion.Text = "";
                txtNCuenta.Text = "";
                txtNombre.Text = "";
                txtApellidos.Text = "";

                pedidoProveedor.Proveedor = null;
            }
            else
            {
                pedidoProveedor.Id = proveedor.Id;
                pedidoProveedor.Proveedor = proveedor;

                Cache.Insert(KeyPedido, pedidoProveedor);

                txtRuc.Text = proveedor.Ruc;
                txtRazon.Text = proveedor.RazonSocial;
                txtDireccion.Text = proveedor.Direccion;
                txtNCuenta.Text = proveedor.NCuenta;
                txtNombre.Text = proveedor.Nombre;
                txtApellidos.Text = proveedor.Apellidos;
                lblMsgProveedor.Text = "";
            }
        }

        public IEnumerable<Producto> GetProductos([Control("txtRuc")]string ruc, [Control("txtNombreProducto")]string criterio)
        {
            return productoService.getAllProductoByProveedorAndProductoNombre(ruc,criterio);
        }

        protected void lvProducto_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "AddDetalle")
            {
                var productoId = Int32.Parse(e.CommandArgument.ToString());

                //recupera pedido del cache
                var pedido = GetPedidoProveedor();

                var existe = pedido.DetallePedidoProveedor.Where(dp => dp.IdProducto == productoId).SingleOrDefault();

                if (existe != null)
                {
                    existe.Cantidad += 1;
                }
                else
                {
                    var producto = productoService.getFromProductoById(productoId);

                    var newDetalle = new DetallePedidoProveedor()
                    {
                        IdPedidoProveedor = pedido.Id,
                        IdProducto = producto.Id,
                        Producto = producto,
                        Precio = producto.PCompra,
                        Cantidad = 1
                    };

                    pedido.DetallePedidoProveedor.Add(newDetalle);
                }
                BindingPedidoProveedor(pedido);
            }
        }        

        protected void lvDetallePedido_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "QuitarDetalle")
            {
                var idProducto = Int32.Parse(e.CommandArgument.ToString());
                //recupera pedido del cache
                var pedido = GetPedidoProveedor();

                var detalle = pedido.DetallePedidoProveedor.Where(dp => dp.IdProducto == idProducto).SingleOrDefault();

                if (detalle != null)
                    pedido.DetallePedidoProveedor.Remove(detalle);

                BindingPedidoProveedor(pedido);
            }
            else if (e.CommandName == "ActualizarDetalle")
            {
                var pedido = GetPedidoProveedor();

                foreach (var row in lvDetallePedido.Items)
                {
                    var txtCantidad = row.FindControl("txtCantidad") as TextBox;
                    var txtPrecio = row.FindControl("txtPrecio") as TextBox;

                    pedido.DetallePedidoProveedor.ToList()[row.DisplayIndex].Cantidad = decimal.Parse(txtCantidad.Text);
                    pedido.DetallePedidoProveedor.ToList()[row.DisplayIndex].Precio = decimal.Parse(txtPrecio.Text);
                }
                BindingPedidoProveedor(pedido);
            }


        }
        
        private PedidoProveedor GetPedidoProveedor()
        {
            return Cache.Get(KeyPedido) as PedidoProveedor;
        }

        protected void btnGuardarPedido_Click(object sender, EventArgs e)
        {
            var pedido = GetPedidoProveedor();
            pedido.Fecha = DateTime.Parse(txtFecha.Text);

            if (pedido != null)
            {
                if (ViewState["opc"].ToString() == "new")
                {
                    pedidoService.addPedidoProveedor(pedido);

                    Response.Redirect("FrmListaPedidoProveedor.aspx");
                    
                }
                else if (ViewState["opc"].ToString() == "editar")
                {
                    pedidoService.upDatePedidoProveedor(pedido);
                    Response.Redirect("FrmListaPedidoProveedor.aspx");
                }
            }
        }
    }
}